﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>


////练习1：多个字符从两端移动，向中间汇聚
//
//int main()
//{
//	char arr1[] = "welcome to bit...";
//	char arr2[] = "#################";
//	int left = 0;
//	int right = strlen(arr1) - 1;  //strlen函数专门计算字符串长度。需要包含string.h头文件
//
//	while (left <= right)  //当左边大于右边时，停止循环
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//	
//		Sleep(1000);				//放慢10000ms。系统函数，需要包含windows.h头文件
//		system("cls");             //清理屏幕函数，需要包含stdlib.h头文件
//		printf("%s\n",arr2);		//把每次替换的都打印出来以达到移动效果
//
//		left++;		//左边往右走
//
//		right--;	//右边往左走
//
//
//
//	}
//
//
//	return 0;
//}




//练习2：⼆分查找/折半查找 （在有序的数组中更适用）
// 
//⽐如我买了⼀双鞋，你好奇问我多少钱，我说不超过300元。你还是好奇，你想知道到底多少，我就让
//你猜，你会怎么猜？你会1，2，3，4...这样猜吗？显然很慢；⼀般你都会猜中间数字，⽐如：150，然
//后看⼤了还是⼩了，这就是⼆分查找，也叫折半查找。


int main()
{
	int count = 0;		//创建次数，查看二分查找需要查几次
	int key = 0;		//创建要查找的数
	int find = 0;		//创建找到的标志，如果最后find还是0，说明没找到。如果找到了find赋值为1，说明找到了

	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };	//创建库。被查找数在库中查找
	printf("输入你所想查找的数字：");
	scanf("%d",&key);		//自定义获取被查找数

	//使用数组下标作为左右标志,在后续循环中方便
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;
	int mid = 0;		//在二分查找需要获得中间的数来对半砍，这里先创建一个变量，循环中再计算

	while(left <= right)
	{
		count++;			//只要进入循环，就相当于查找一次，所以进入循环先次数+1

		mid = (left + right) / 2;     //这里才计算数组左右的中间下标值

		if(key >arr[mid])//注意，这里mid是下标，不是所指代的数，要想表示所指代的数，需要写成arr[mid]形式
		{
			left = mid + 1;
		}
		else if (key < arr[mid])
		{
			right = mid - 1;
		}
		else
		{
			find = 1;		//要查找数被查找到后完成的标志

			break;		//找到要查找的数以后，跳出这个while循环
		}
	}

	if (find == 1) 
	{
		printf("找到了，这个数下标为 %d ,查找次数为：%d",mid,count);
	}
	else
	{
		printf("找不到，没有你所找的数");
	}


	return 0;
}